package metier.outils;
import java.awt.Point;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;

import metier.modele.Constantes;
import metier.modele.Figure;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


/**
 * Classe servant à l'exportation d'une liste de figures
 * en un fichier SVG
 * @author Quentin, Vincent, Charlie
 *
 */
public class ExportSvg
{
	
	private static Element root;
	private static org.jdom.Document document;
	private static String fichier;
	private Namespace ns = Namespace.getNamespace("http://www.w3.org/2000/svg");
	private Namespace nsPerso = Namespace.getNamespace("ex",Constantes.NS_PERSO);
	private LinkedList<Figure> listFigure;

	/**
	 * Constructeur
	 * @param nomFichier
	 * @param list
	 */
	public ExportSvg(String nomFichier, LinkedList<Figure> list)
	{
		root =new Element("svg", ns);
		root.addNamespaceDeclaration(nsPerso);
		document = new Document(root);
		fichier = nomFichier;		
		this.listFigure = list;
	}

	/**
	 * Exportation suivant le type de figure
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void graphicToSVG () throws FileNotFoundException, IOException
	{

		for(Figure iter : this.listFigure)
		{
			if(iter instanceof Tools_Ellipse)
			{
				//Si c'est une ellipse
				String HexBG = Integer.toHexString(iter.getBg().getRGB());
				HexBG = HexBG.substring(2, HexBG.length());
				
				String HexFG = Integer.toHexString(iter.getFg().getRGB());
				HexFG = HexFG.substring(2, HexFG.length());
				
				String owner = iter.getOwner().getNom();
				
				this.drawEllipse(iter.getX1(), iter.getY1(), iter.getX2(), iter.getY2(), HexBG, HexFG, owner);
			}
			else if(iter instanceof Tools_Rect)
			{
				//si c'est un rectangle
				String HexBG = Integer.toHexString(iter.getBg().getRGB());
				HexBG = HexBG.substring(2, HexBG.length());
				
				String HexFG = Integer.toHexString(iter.getFg().getRGB());
				HexFG = HexFG.substring(2, HexFG.length());
				
				String owner = iter.getOwner().getNom();
				
				this.drawRect(iter.getX1(), iter.getY1(), iter.getX2(), iter.getY2(), HexBG, HexFG, owner);
			}
			else if(iter instanceof Tools_Trait)
			{				
				String HexFG = Integer.toHexString(iter.getFg().getRGB());
				HexFG = HexFG.substring(2, HexFG.length());
				
				String owner = iter.getOwner().getNom();
				
				this.drawLine(iter.getX1(), iter.getY1(), iter.getX2(), iter.getY2(), HexFG, owner);
			}
			else if(iter instanceof Tools_Main)
			{
				String HexFG = Integer.toHexString(iter.getFg().getRGB());
				HexFG = HexFG.substring(2, HexFG.length());
				
				String owner = iter.getOwner().getNom();
				
				this.drawPolyline(((Tools_Main)iter).getList(), HexFG, owner);
			}
		}
	}
	
	/**
	 * Importation
	 * @param fichier
	 * @param list
	 */
	void SVGToGraphic(String fichier, LinkedList<Figure> list)
	{
		// TODO
	}

	
	/**
	 * Rectangle en SVG
	 * @param x : point en haut Ã  gauche du rectangle selon x
	 * @param y : point en haut Ã  gauche du rectangle selon y
	 * @param x2 : point en bas Ã  droite du rectangle selon x
	 * @param y2 : point en bas Ã  droite du rectangle selon y
	 * @param remplissage : couleur de remplissage au format RGB, ne pas mettre de #
	 * @param contour : couleur de contour au format RGB, ne pas mettre de #
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void drawRect(int x, int y, int x2, int y2, String remplissage, String contour, String owner) throws FileNotFoundException, IOException
	{
		Element rectangle = new Element("rect", ns);
		root.addContent(rectangle);

		int width=x2-x;
		int height=y2-y;
		
		Attribute xAtt = new Attribute("x",String.valueOf(x));
		Attribute yAtt = new Attribute("y",String.valueOf(y));
		Attribute widthAtt = new Attribute("width",String.valueOf(width));
		Attribute heightAtt = new Attribute("height",String.valueOf(height));
		Attribute style1Att = new Attribute("stroke","#"+contour);
		Attribute style2Att = new Attribute("fill","#"+remplissage);
		Attribute attrOwner = new Attribute("owner", owner, nsPerso);

		rectangle.setAttribute(xAtt);
		rectangle.setAttribute(yAtt);
		rectangle.setAttribute(widthAtt);
		rectangle.setAttribute(heightAtt);
		rectangle.setAttribute(style1Att);
		rectangle.setAttribute(style2Att);
		rectangle.setAttribute(attrOwner);
		
		save();
	}
	
	/**
	 * Ligne en SVG
	 * @param x1 : coordonnÃ©e sur l'axe-x du dÃ©part du segment de droite.
	 * @param y1 : coordonnÃ©e sur l'axe-y du dÃ©part du segment de droite.
	 * @param x2 : coordonnÃ©e sur l'axe-x de la fin du segment de droite.
	 * @param y2 : coordonnÃ©e; sur l'axe-y de la fin du segment de droite.
	 * @param couleur : couleur de trait au format RGB, ne pas mettre de #
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void drawLine(int x1, int y1, int x2, int y2, String couleur, String owner) throws FileNotFoundException, IOException
	{
		Element line = new Element("line", ns);
		root.addContent(line);

		Attribute x1Att = new Attribute("x1",String.valueOf(x1));
		Attribute y1Att = new Attribute("y1",String.valueOf(y1));
		Attribute xAtt = new Attribute("x2",String.valueOf(x2));
		Attribute yAtt = new Attribute("y2",String.valueOf(y2));
		Attribute styleAtt = new Attribute("stroke","#"+couleur);
		Attribute attrOwner = new Attribute("owner", owner, nsPerso);

		line.setAttribute(x1Att);
		line.setAttribute(y1Att);
		line.setAttribute(xAtt);
		line.setAttribute(yAtt);
		line.setAttribute(styleAtt);
		line.setAttribute(attrOwner);
		
		save();		
	}
	
	/**
	 * Ellipse en SVG
	 * @param ax : point haut gauche x
	 * @param ay : point haut gauche y
	 * @param bx : point bas droit x
	 * @param by : point bas droit y
	 * @param remplissage : couleur de remplissage au format RGB, ne pas mettre de #
	 * @param contour : couleur de contour au format RGB, ne pas mettre de #
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void drawEllipse(int ax, int ay, int bx, int by, String remplissage, String contour, String owner) throws FileNotFoundException, IOException
	{
		Element ellipse = new Element("ellipse", ns);
		root.addContent(ellipse);

		
		int cx, cy, rx, ry;
		rx=(bx-ax)/2;
		ry=(by-ay)/2;
		cx=ax+rx;
		cy=ay+ry;
		
		Attribute cxAtt = new Attribute("cx",String.valueOf(cx));
		Attribute cyAtt = new Attribute("cy",String.valueOf(cy));
		Attribute rxAtt = new Attribute("rx",String.valueOf(rx));
		Attribute ryAtt = new Attribute("ry",String.valueOf(ry));
		Attribute style1Att = new Attribute("stroke","#"+contour);
		Attribute style2Att = new Attribute("fill","#"+remplissage);
		Attribute attrOwner = new Attribute("owner", owner, nsPerso);

		ellipse.setAttribute(cxAtt);
		ellipse.setAttribute(cyAtt);
		ellipse.setAttribute(rxAtt);
		ellipse.setAttribute(ryAtt);
		ellipse.setAttribute(style1Att);
		ellipse.setAttribute(style2Att);
		ellipse.setAttribute(attrOwner);
		
		save();
	}
	
	/**
	 * Ligne multiple (dessin à main levée)
	 * @param list
	 * @param couleur
	 * @param owner
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public void drawPolyline(LinkedList<Point> list, String couleur, String owner) throws FileNotFoundException, IOException
	{
		Element polyline = new Element("polyline", ns);
		root.addContent(polyline);

		String points="";
		
		for(Point iter : list){
			points+=iter.x+","+iter.y+" ";
		}
		
		Attribute pointsAtt = new Attribute("points",points);
		Attribute styleAtt = new Attribute("stroke","#"+couleur);
		Attribute fillAtt = new Attribute("fill", "none");
		Attribute attrOwner = new Attribute("owner", owner, nsPerso);

		polyline.setAttribute(pointsAtt);
		polyline.setAttribute(styleAtt);
		polyline.setAttribute(fillAtt);
		polyline.setAttribute(attrOwner);
		
		save();
		
	}
	
	
	/**
	 * Génération du document
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	private static void save() throws FileNotFoundException, IOException
	{
	
		{
			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
			sortie.output(document, new FileOutputStream(fichier));
		}
		
		
	}


}